//! # Util - 工具模块
//!
//! 包含一些分散，不足以成为一个单独模块的工具函数。

use std::{path::PathBuf, str::FromStr};

use tauri::{Runtime, Window};

use crate::event::{MP4GameEvent, WINDOW_VISIBILITY};

/// 获取数据目录路径
///
/// # 返回值
///
/// * [`Ok`] - 数据目录路径
/// * [`Err`] - 失败
///
/// # 示例
///
/// ```
/// let data_dir = get_data_dir();
/// ```
pub fn get_data_dir() -> PathBuf {
    if let Some(mut ret) = dirs::data_dir() {
        ret.push("MP4Game");
        ret
    } else {
        PathBuf::from_str("./data/").unwrap()
    }
}

/// 显示或隐藏窗口。
///
/// 状态切换后会向 Rust Listener 发送 [`MP4GameEvent::WindowVisibility`] 事件。
///
/// # 参数
///
/// * `window` - 窗口
///
/// # 返回值
///
/// * [`Ok`] - 成功
/// * [`Err`] - 失败
///
/// # 示例
///
/// ```
/// set_window_visibility(window, true).unwrap();
/// ```
pub fn set_window_visibility<R: Runtime>(window: &Window<R>, visible: bool) -> Result<(), String> {
    // 显示或隐藏
    if visible {
        window.show()
    } else {
        window.hide()
    }
    .map_err(|e| e.to_string())
    // 发送事件
    .and_then(|_| {
        log::debug!(
            "发送 {} 事件，当前窗口可见性为 {}",
            WINDOW_VISIBILITY,
            visible
        );

        MP4GameEvent::WindowVisibility(visible)
            .trigger_global(window)
            .map_err(|e| e.to_string())
    })
}

/// 设置窗口材质
///
/// # 参数
///
/// * `window` - 窗口
/// * `dark` - 是否为深色模式，默认为 false
///
/// # 返回值
///
/// * [`Ok`] - 成功
/// * [`Err`] - 失败
///
/// # 示例
///
/// ```
/// set_window_materia(window, true).unwrap();
/// ```
pub fn set_window_materia<R: Runtime>(
    window: &Window<R>,
    dark: Option<bool>,
) -> Result<(), String> {
    cfg_if::cfg_if! {
        if #[cfg(target_os = "macos")] {
            window_vibrancy::apply_vibrancy(
                window,
                window_vibrancy::NSVisualEffectMaterial::AppearanceBased,
                None,
                None,
            )
            .map_err(|e| e.to_string())
        } else if #[cfg(target_os = "windows")] {
            // 根据 windows 版本选择不同的效果
            if let os_info::Version::Semantic(major, _, patch) = os_info::get().version().clone() {
                if major > 10 || (major == 10 && patch >= 22523) {
                    // 10.0.22523+ 以上版本使用 tabbed 效果
                    window_vibrancy::apply_tabbed(window, dark)
                } else if major == 10 && patch >= 22000 {
                    // 10.0.22000+ 以上版本使用 mica 效果
                    window_vibrancy::apply_mica(window, dark)
                } else if (major == 10 && patch >= 1809) || major == 7 {
                    // 10.0.1809+ 以及 7 以上版本使用 blur 效果
                    window_vibrancy::apply_blur(window, Some((18, 18, 18, 125)))
                } else {
                    // 版本太老，不设置窗口材质
                    Ok(())
                }
                .map_err(|e| e.to_string())
            } else {
                Err("Windows 版本号信息异常，窗口材质设置失败".to_string())
            }
        } else  {
            Ok(())
        }
    }
}
